工厂设计模式(Factory Pattern)
描述: 工厂设计模式是用来生产对象的,在java中万般皆对象,如果创建的时候使用new 关键字会出现耦合严重,如果我们的对象名称换了那么所有出现此对象的地方都要进行修改。维护起来会十分的麻烦,所以就会使用工厂设计模式。
工厂设计模式的种类:
- 简单工厂(Simple Factory Pattern)
- 工厂方法(Factory Method)
- 抽象工厂(Abstract Factory)
简单工厂设计模式(Simple Factory Pattern) /静态工厂方法
示例:
1 2 3 4
| public interface Computer { String getRAM(); String getCPU(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Lianxiang implements Computer{ String ram; String cpu; public Lianxiang(String ram,String cpu){ this.cpu=cpu; this.ram=ram; } @Override public String getRAM() { return "联想的cpu是"+cpu; } @Override public String getCPU() { return "联想的ram是"+ram; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Huawei implements Computer { String ram; String cpu; public Huawei(String ram,String cpu){ this.cpu=cpu; this.ram=ram; } @Override public String getRAM() { return "华为的cpu是"+cpu; } @Override public String getCPU() { return "华为的ram是"+ram; } }
|
1 2 3 4 5 6 7 8 9 10
| public class ComputerFactory { public static Computer getComputer(String type,String cpu,String ram){ if("Huawei".equals(type)){ return new Huawei(ram,cpu); }else if("Lianxiang".equals(type)){ return new Lianxiang(ram,cpu); } return null; } }
|
1 2 3 4 5 6
| public class test { public static void main(String[] args) { Computer computer = ComputerFactory.getComputer("Huawei", "32G", "Inter"); System.out.println(computer.getCPU()+computer.getRAM()); } }
|
优点: 上下解耦, 如联想的命名改变,则客户端是不需要知道的
缺点: 违反开闭原则,当我要增加一种品牌的电脑时休要修改工厂类,因此它只适用于产品对象较少的需求。
附图:
工厂方法设计模式(Factory Method)
描述: 主要用来创建单个产品的
示例:
1 2 3 4
| public interface Computer { String getRAM(); String getCPU(); }
|
1 2 3
| public interface ComputerFactory { Computer getComputer( String cpu, String ram); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Huawei implements Computer { String ram; String cpu; public Huawei(String ram,String cpu){ this.cpu=cpu; this.ram=ram; } public String getRAM() { return "华为的cpu是"+cpu; } public String getCPU() { return "华为的ram是"+ram; } }
|
1 2 3 4 5
| public class HuaweiFactory implements ComputerFactory { public Computer getComputer(String cpu, String ram) { return new Huawei(ram , cpu); } }
|
1 2 3 4 5 6
| public static void main(String[] args) { HuaweiFactory huaweiFactory = new HuaweiFactory(); Computer inter = huaweiFactory.getComputer("inter", "32G"); System.out.println(inter); } }
|
优点: 符合开闭原则 , 上下解耦 。 如果要增加一个电脑工厂不用修改任何代码,直接实现Computer 和 ComputerFactory 即可
缺点: 如果电脑的厂家很多的话会造成类的爆炸式增长,
附图:
抽象工厂设计模式(Abstract Factory)
描述: 抽象工厂设计模式主要是用来创建 一系列的产品
应用场景: 当我们的一系列的产品簇趋向于稳定的时候,生产厂家可以变动,也就是华为只生产电脑和手机,不在扩展其他业务的时候使用它,而生产厂家可以有多个,不只华为一家
示例:
1 2 3 4 5 6 7
| public interface DianNaoFactory {
void hdiannao(); void ldiannao(); void qdiannao(); void xdiannao(); }
|
1 2 3 4 5 6 7
| public interface ShowJiFactory { void p9shouji(); void p3shouji(); void p4shouji(); void p8shouji(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class HuaweiDiaNao implements DianNaoFactory { public void hdiannao() { System.out.println("h系类的电脑"); } public void ldiannao() { System.out.println("l系类的电脑"); } public void qdiannao() { System.out.println("q系类的电脑"); } public void xdiannao() { System.out.println("x系类的电脑"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class HuaweiShouJi implements ShowJiFactory { public void p9shouji() { System.out.println("p9系类的手机"); } public void p3shouji() { System.out.println("p3系类的手机"); } public void p4shouji() { System.out.println("p4系类的手机"); } public void p8shouji() { System.out.println("p8系类的手机"); } }
|
1 2 3 4 5 6 7
| public interface JiadainFactory { DianNaoFactory dianNaoFactory(); ShowJiFactory showJiFactory(); }
|
1 2 3 4 5 6 7 8
| public class Huawei implements JiadainFactory{ public DianNaoFactory dianNaoFactory() { return new HuaweiDiaNao() ; } public ShowJiFactory showJiFactory() { return new HuaweiShouJi(); } }
|
1 2 3 4 5 6 7
| public static void main(String[] args) { JiadainFactory jiadain = new Huawei(); jiadain.dianNaoFactory().hdiannao(); jiadain.showJiFactory().p3shouji();
} }
|
优点: 具体的产品代码隔离,无需关注创建的细节,将一个系列的产品在一起创建。也就是我们增加生产厂家的时候是很容易的。
缺点: 显而易见,当我们要怎加一个产平簇的时候是很麻烦的,我们要修改生产厂家的接口,违反开闭原则。
附图: