工厂方法模式
模式动机
:简单工厂模式如果需要新增新的产品,就要修改工厂类的代码,因此,定义一个抽象工厂类,并在具体 工厂类重写该抽象工厂中定义的抽象方法。抽象化的结果使这种结构可以在不修改已有具体工厂类的情况下引进新的产品。
模式定义
:定义一个用于创建对象的接口,让子类决定实现实例化哪个类。父类负责定义创建对象的公共接口,子类负责生产具体的对象。
模式对象
:抽象产品、具体产品、抽象工厂、具体工厂
/**
* @description:工厂方法模式
*/
interface Product1{//抽象产品
public void play();
}
class Product1A implements Product1{//具体产品:A
@Override
public void play() {
System.out.println("A电视播放中----");
}
}
class Product1B implements Product1{//具体产品:B
@Override
public void play() {
System.out.println("B电视播放中----");
}
}
abstract class Factory1{//抽象工厂
public abstract Product1 facoryMethod();
}
class Factory1A extends Factory1{//具体工厂:A
@Override
public Product1 facoryMethod() {
return new Product1A();
}
}
class Factory1B extends Factory1{//具体工厂:B
@Override
public Product1 facoryMethod() {
return new Product1B();
}
}
public class FactoryMethod {
public static void main(String[] args) {
Factory1A factory1=new Factory1A();
Product1 product1=factory1.facoryMethod();
product1.play();
System.out.println("---------------");
Factory1B factory2= new Factory1B();
product1=factory2.facoryMethod();
product1.play();
}
}
模式评价
例题
:有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用JAVA程序实现该OEM制造商的工厂模式。绘制该模式的UML图。
abstract class Laptop{//抽象电脑类
public abstract void play();
}
class HPLaptop extends Laptop{//具体产品:HP
@Override
public void play() {
System.out.println("HP电脑");
}
}
class AcerLaptop extends Laptop{//具体产品:AcerL
@Override
public void play() {
System.out.println("Acer电脑");
}
}
class LenovoLaptop extends Laptop{//具体产品:Lenovo
@Override
public void play() {
System.out.println("Lenovo电脑");
}
}
class DellLaptop extends Laptop{//具体产品:Dell
@Override
public void play() {
System.out.println("Dell电脑");
}
}
//电脑品牌类型工厂抽象类
interface LaptopFactory{
Laptop CreateLaptop();
}
class HPLaptopFactory implements LaptopFactory{
@Override
public Laptop CreateLaptop() {
// TODO Auto-generated method stub
return new HPLaptop();
}
}
class AcerLaptopFactory implements LaptopFactory{
@Override
public Laptop CreateLaptop() {
// TODO Auto-generated method stub
return new AcerLaptop();
}
}
class LenovoLaptopFactory implements LaptopFactory{
@Override
public Laptop CreateLaptop() {
// TODO Auto-generated method stub
return new LenovoLaptop();
}
}
class DellLaptopFactory implements LaptopFactory{
@Override
public Laptop CreateLaptop() {
// TODO Auto-generated method stub
return new DellLaptop();
}
}
public class Client2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
LaptopFactory laptopFactory1 =new HPLaptopFactory();
LaptopFactory laptopFactory2 =new AcerLaptopFactory();
LaptopFactory laptopFactory3 =new LenovoLaptopFactory();
LaptopFactory laptopFactory4 =new DellLaptopFactory();
Laptop laptop1=laptopFactory1.CreateLaptop();
Laptop laptop2=laptopFactory2.CreateLaptop();
Laptop laptop3=laptopFactory3.CreateLaptop();
Laptop laptop4=laptopFactory4.CreateLaptop();
laptop1.play();
laptop2.play();
laptop3.play();
laptop4.play();
}
}