设计模式(四) Factory Pattern工厂模式
核心:
实例化对象,实现创建者和调用者的分离
简单工厂模式
工厂方法模式
抽象工厂模式
面对对象设计的基本原则:
ocp(open closed principle) 开闭原则:一个软件的实体应当对拓展开放,对修改关闭
dip(dependence inversion principle) 依赖反转原则:针对接口编程,不要针对实现编程
lod(law of demeter) demeter法则:只与你直接的朋友通信,避免与陌生人通信
简单工厂模式(Simple Factory Pattern):
public class Car {
}
public class Byd extends Car{
}
public class Audi extends Car{
}
public class CarFactory {
public static Car createCar(String type){
if("audi".equals(type)){
return new Audi();
}else if("byd".equals(type)){
return new Byd();
}else return null;
}
}
public class Test {
public static void main(String[] args) {
Car c=CarFactory.createCar("奥迪");
}
}
UML图:

由于上述方法未实现开闭原则,则引入工厂方法模式(FactoryMethod)
工厂方法模式(Factory Method Pattern):
public class Car {
}
public class Audi extends Car{
}
public class Byd extends Car{
}
public interface CarFactory {
Car createCar();
}
public class AudiFactory implements CarFactory{
@Override
public Car createCar() {
return new Audi();
}
}
public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new Byd();
}
}
public class Client {
public static void main(String[] args) {
Car c1=new AudiFactory().createCar();
Car c2=new BydFactory().createCar();
}
}
UML图:

结构复杂,但是但是容易扩展
抽象工厂模式(Abstract Factory Pattern):
产品族:用来生产不同产品族的全部产品
package com.littlepage.factoryPattern.abstractFactory;
public interface Engine {
void run();
void start();
}
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("启动快");
}
@Override
public void start() {
System.out.println("开始快");
}
}
class LowEngine implements Engine{
@Override
public void run() {
System.out.println("启动慢");
}
@Override
public void start() {
System.out.println("开始慢");
}
}
package com.littlepage.factoryPattern.abstractFactory;
public interface Seats {
void massage();
}
class LuxurySeat implements Seats {
@Override
public void massage() {
System.out.println("自动按摩");
}
}
class LowSeat implements Seats {
@Override
public void massage() {
System.out.println("手动按摩");
}
}
package com.littlepage.factoryPattern.abstractFactory;
public interface Tyre {
void revolve();
}
class LuxuryTyre implements Tyre{
@Override
public void revolve() {
System.out.println("旋转快");
}
}
class LowTyre implements Tyre{
@Override
public void revolve() {
System.out.println("旋转慢");
}
}
package com.littlepage.factoryPattern.abstractFactory;
public interface CarFactory {
Engine createEngine();
Seats createSeat();
Tyre createTyre();
}
class LuxuryCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seats createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
class LowCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seats createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
package com.littlepage.factoryPattern.abstractFactory;
public class Client {
public static void main(String[] args) {
CarFactory factory=new LuxuryCarFactory();
Engine e=factory.createEngine();
e.start();
}
}
UML图(按照层级来看):

设计模式(四) Factory Pattern工厂模式的更多相关文章
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- Factory Pattern(工厂模式)
1.工厂模式简介 工厂模式,专门负责将大量有共同接口的类实例化(用来生产对象).其定义为定义一个用于创建对象的接口,让子类决定实例化那一个类.工厂方法使一个类的实例化延迟到其子类. 工厂模式拥有以下几 ...
- 设计模式之——Factory(工厂模式)
工厂模式用于,通过统一的创建对象接口来创建对象,而子类可以决定对象的创建方式. class CObject { }; class CCar : public CObject { }; class CF ...
- 2.设计模式-Abstract Factory 抽象工厂模式
大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...
- 设计模式(一)工厂模式Factory(创建型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
- 设计模式(一)工厂模式Factory(创建类型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
- 设计模式(一)工厂模式Factory(创建型)(转)
原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- JAVA设计模式(二)工厂模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
随机推荐
- 高级架构进阶之HashMap源码就该这么学
引言--面试常见的问题 问:“你用过HashMap,你能跟我说说它吗?” “当然用过,HashMap是一种<key,value>的存储结构,能够快速将key的数据put方式存储起来,然后很 ...
- Spring/SpringMVC/MyBatis(持久层、业务层、控制层思路小结)
准备工作: ## 7 导入省市区数据到数据库中 1. 从FTP下载SQL脚本文件 2. 把脚本文件移动到易于描述绝对路径的位置 3. 进入MySQL控制台 4. 使用`xxx_xxx`数据库 5. 运 ...
- P2617 Dynamic Rankings(树状数组套主席树)
P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...
- bzoj4720 / P1850 换教室(Floyd+期望dp)
P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...
- 应使用sqlplus代替tnsping进行oracle连通性测试
一直以来,都习惯于tnsping alias测试确定使用了那个sqlnet.ora,并测试连通性.最近在制作系统的安装包,为了轻量级以及提高实施效率,全部客户端使用oracle instant cli ...
- windows 10下oracle相关异常及处理方法
话说起来,不以oracle性能优化,数据库维护为主业已经有四五年了,这两年基本上以mysql为主. pl/sql登录后提示空白对话框.将ORACLE_HOME设置为oracle 11g的目录. IMP ...
- 配置使用 git 秘钥连接 GitHub
配置使用 git 秘钥连接 GitHub 在Linux下部署Git环境 1.安装Git. 使用命令安装 git . sudo apt-get install git 2.创建一个 Github 账号 ...
- Kali系列之Hydra/Medusa mysql密码爆破
hydra hydra -L /home/chenglee/zidian/user.txt -P /home/chenglee/zidian/wordlist.TXT 192.168.137.133 ...
- ldap集成rabbitmq
rabbitmq版本: 3.7.4 rabbitmq支持ldap需要开启插件: rabbitmq-plugins enable rabbitmq_auth_backend_ldap rab ...
- Codeforces Round #481 (Div. 3)题解
成功掉到灰,真的心太累了,orz!!!!,不是很懂那些国外大佬为什么每次都是20多分钟AK的,QAQ A. Remove Duplicates time limit per test 1 second ...