1.使用场景:
1.类不知道自己要创建哪一个对象
2.类用它的子类来指定创建哪个对象
3.客户需要清楚创建了哪一个对象
2.三种不同工厂的区别
简单工厂:针对一种产品。缺点是破坏了开放,封闭原则。
工厂模式: 对简单工厂做了相应的改进,改正了简单工厂破坏开放封闭原则的错误。
抽象工厂:针对于多种产品,和简单工厂以及工厂模式并无太大的关联。
3.UML表示
简单工厂:
工厂模式:
抽象工厂:
4.代码实现
首先是简单工厂的代码实现:
我们以一个手机加工厂的例子展开,首先是Phone接口的相关代码:
public interface Phone {
void function();
}
接下来是每一个具体厂商的手机:
public class HuanWei implements Phone{
@Override
public void function() {
System.out.println("不用不是中国人?");
}
}
public class XiaoMi implements Phone {
@Override
public void function() {
System.out.println("燃烧吧!");
}
}
public class Iphone implements Phone {
@Override
public void function() {
System.out.println("只要$999");
}
}
普通工厂类:
public class PhoneFactory {
public static Phone createPhone(String type){
if ("小米".equals(type)){
return new XiaoMi();
}
else if ("华为".equals(type)){
return new HuanWei();
}
else if ("Iphone".equals(type)){
return new Iphone();
}
else return null;
}
}
其次是工厂模式的代码实现,Phone接口与简单工厂类似,新增手机工厂接口:
public interface PhoneFactory {
Phone createPhone();
}
public class Iphone implements Phone {
@Override
public void function() {
System.out.println("只要$999");
}
}
public class IphoneFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new Iphone();
}
}
然后是抽象工厂的代码实现,抽象工厂主要是整合多个不同的对象,例如下面的例子:分别使用不同的零件就能整合出手机以及个人PC。
CPU接口:
public interface CPU {
void name();
}
其他零部件的接口类似,这里省略。
电子加工工厂接口:
public interface ElectronicFactory {
CPU createCpu();
GraphicsProcessor createG();
Screen createScreen();
}
手机加工工厂类:
public class PhoneFactory implements ElectronicFactory {
@Override
public CPU createCpu() {
return new Pcpu();
}
@Override
public GraphicsProcessor createG() {
return new PhoneG();
}
@Override
public Screen createScreen() {
return new PhoneScreen();
}
}
PC机加工工厂类:
public class PcFactory implements ElectronicFactory {
@Override
public CPU createCpu() {
return new Pcpu();
}
@Override
public GraphicsProcessor createG() {
return new PcG();
}
@Override
public Screen createScreen() {
return new PcScreen();
}
}
最后,给出项目的代码连接:
https://github.com/MemoryExplosion/design_pattern_review/tree/master/src/java/factory